package com.zxh.blog.util.excelDemo;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * @Author:wb-zxh410423
 * @Description:
 * @Date: Created in 14:34 2018/12/11
 */
public class ReflectUtils {
	private ReflectUtils(){}

	public static <T> String getString(Field f, T obj){
		try {
			f.setAccessible(true);
			Object value = f.get(obj);
			return value != null ? value.toString() : null;
		} catch (IllegalAccessException e) {
			return null;
		}
	}

	public static <T> Object getFieldValue(Field f,T obj){
		try {
			f.setAccessible(true);
			return f.get(obj);
		} catch (IllegalAccessException e) {
			return null;
		}
	}

	/**
	 * 获取所有字段，包含通过继承关系获取到的字段，本类私有字段，本类公有字段。
	 * 最好不要在过深的嵌套类上调用该方法。
	 * @param type
	 * @return
	 */
	public static List<Field> getAllFields(Class<?> type){
		List<Field> fields = new ArrayList<>();
		for(Class<?> c =type;c != null;c = c.getSuperclass()){
			fields.addAll(Arrays.asList(c.getDeclaredFields()));
		}
		return fields;
	}

	/**
	 * 获取指定类型指定名称的字段，查找范围包含继承关系字段
	 * 最好不要在过深的嵌套类上调用该方法。
	 * @param type 类型
	 * @param fieldName 字段名称
	 * @return 第一个找到的对象的Opt
	 */
	public static Optional<Field> getField(Class<?> type,String fieldName){
		List<Field> allFields = getAllFields(type);
		return allFields.stream().filter(x -> x.getName().equals(fieldName)).findFirst();
	}

}
